home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
sph_4pnt.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
4KB
|
119 lines
; $Id: sph_4pnt.pro,v 1.10 1997/01/15 03:11:50 ali Exp $
;
; Copyright (c) 1994-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME:
; SPH_4PNT
;
; PURPOSE:
; Given four 3-dimensional points, this procedure returns the
; center and radius necessary to define the unique sphere passing
; through those points.
;
; CATEGORY:
; Analytic Geometry.
;
; CALLING SEQUENCE:
; SPH_4PNT, X, Y, Z, Xc, Yc, Zc, R
;
; INPUTS:
; X: A 4-element vector containing the X coordinates of the points.
; Y: A 4-element vector containing the Y coordinates of the points.
; Z: A 4-element vector containing the Z coordinates of the points.
;
; Note: X, Y, and Z should be floating-point or double-precision
; vectors.
;
; OUTPUTS:
; Xc: The sphere's center x-coordinate.
; Yc: The sphere's center y-coordinate.
; Zc: The sphere's center z-coordinate.
; R: The sphere's radius.
;
; RESTRICTIONS:
; Points may not coincide.
;
; EXAMPLE:
; Find the center and radius of the unique sphere passing through
; the points: (1, 1, 0), (2, 1, 2), (1, 0, 3), (1, 0, 1)
;
; Define the floating-point vectors containing the x, y and z
; coordinates of the points.
; X = [1, 2, 1, 1] + 0.0
; Y = [1, 1, 0, 0] + 0.0
; Z = [0, 2, 3, 1] + 0.0
;
; Compute the sphere's center and radius.
; SPH_4PNT, X, Y, Z, Xc, Yc, Zc, R
;
; Print the results.
; PRINT, Xc, Yc, Zc, R
;
; MODIFICATION HISTORY:
; Written by: GGS, RSI, Jan 1993
; Modified: GGS, RSI, March 1994
; Rewrote documentation header.
; Uses the new Numerical Recipes NR_LUDCMP/NR_LUBKSB.
; Modified: GGS, RSI, November 1994
; Changed internal array from column major to row major.
; Changed NR_LUDCMP/NR_LUBKSB to LUDC/LUSOL
; Modified: GGS, RSI, June 1995
; Added DOUBLE keyword.
; Modified: GGS, RSI, April 1996
; Modified keyword checking and use of double precision.
;-
PRO SPH_4PNT, X, Y, Z, Xc, Yc, Zc, R, Double = Double
ON_ERROR, 2
if N_PARAMS() ne 7 then $
MESSAGE, "Incorrect number of arguments."
TypeX = SIZE(X) & TypeY = SIZE(Y) & TypeZ = SIZE(Z)
if TypeX[TypeX[0]+2] ne 4 or $
TypeY[TypeY[0]+2] ne 4 or $
TypeZ[TypeZ[0]+2] ne 4 then $
MESSAGE, "X, Y, and Z coordinates are of incompatible size."
;If the DOUBLE keyword is not set then the internal precision and
;result are determined by the type of input.
if N_ELEMENTS(Double) eq 0 then $
Double = (TypeX[TypeX[0]+1] eq 5 or $
TypeY[TypeY[0]+1] eq 5 or $
TypeZ[TypeZ[0]+1] eq 5)
if Double eq 0 then A = FLTARR(3,3) else A = DBLARR(3,3)
;Define the relationships between X, Y and Z as the linear system.
for k = 0, 2 do begin
A[0, k] = X[k] - X[k+1]
A[1, k] = Y[k] - Y[k+1]
A[2, k] = Z[k] - Z[k+1]
endfor
;Define right-side of linear system.
Q = X^2 + Y^2 + Z^2
C = 0.5 * (Q[0:2] - Q[1:3])
;Solve the linear system Ay = c where y = (Xc, Yc, Zc)
LUDC, A, Index, Double = Double
;Solution y is stored in C
C = LUSOL(A, Index, C, Double = Double)
;The sphere's center x-coordinate.
Xc = C[0]
;The sphere's center y-coordinate.
Yc = C[1]
;The sphere's center z-coordinate.
Zc = C[2]
;The sphere's radius.
R = SQRT(Q[0] - 2*(X[0]*Xc + Y[0]*Yc + Z[0]*Zc) + Xc^2 + Yc^2 + Zc^2)
END